草庐IT

c++ - Lua C++ 表迭代

全部标签

c++ - 循环内的迭代器初始化是否被认为是不好的风格,为什么?

通常你会发现这样的STL代码:for(SomeClass::SomeContainer::iteratorIter=m_SomeMemberContainerVar.begin();Iter!=m_SomeMemberContainerVar.end();++Iter){}但我们实际上建议这样写:SomeClass::SomeContainer::iteratorIter=m_SomeMemberContainerVar.begin();SomeClass::SomeContainer::iteratorIterEnd=m_SomeMemberContainerVar.end();fo

c++ - STL 映射与 vector 的迭代器访问性能?

使用迭代器遍历STL映射与使用vector之间的性能差异是什么?我想使用map键进行插入、删除和一些访问,但我还需要对map中的每个元素进行常规访问。 最佳答案 使用map和vector,遍历整个集合是O(N)。但是(如列表vsvector)vector连续存储元素,因此访问下一个元素要便宜得多,因为它将优化使用缓存,而映射不会。但由于您需要根据键进行查找,因此没有其他选择。您可以使用按第一个元素排序的对vector,但如果集合需要是可变的,这将非常慢。只需使用map。 关于c++-ST

c++ - STL 映射与 vector 的迭代器访问性能?

使用迭代器遍历STL映射与使用vector之间的性能差异是什么?我想使用map键进行插入、删除和一些访问,但我还需要对map中的每个元素进行常规访问。 最佳答案 使用map和vector,遍历整个集合是O(N)。但是(如列表vsvector)vector连续存储元素,因此访问下一个元素要便宜得多,因为它将优化使用缓存,而映射不会。但由于您需要根据键进行查找,因此没有其他选择。您可以使用按第一个元素排序的对vector,但如果集合需要是可变的,这将非常慢。只需使用map。 关于c++-ST

c++ - 为什么path的迭代器在遍历时返回 "\\"?

我正在使用带有文件系统API的新的现代C++17。我在Windows中使用VisualStudio2017工作。以下代码给出了意想不到的结果:#include#includeintmain(){std::filesystem::pathpath(R"(D:\dir\file.cpp)");for(auto&dir:path){std::cout结果是:"D:""\\""dir""file.cpp"为什么要打印“\\”?在GCC9.1.0中测试(请将路径变量中的'\'改为'/'),结果为:"D:""dir""file.cpp"为什么行为不同?根据C++17标准,哪个结果是正确的?

c++ - 为什么path的迭代器在遍历时返回 "\\"?

我正在使用带有文件系统API的新的现代C++17。我在Windows中使用VisualStudio2017工作。以下代码给出了意想不到的结果:#include#includeintmain(){std::filesystem::pathpath(R"(D:\dir\file.cpp)");for(auto&dir:path){std::cout结果是:"D:""\\""dir""file.cpp"为什么要打印“\\”?在GCC9.1.0中测试(请将路径变量中的'\'改为'/'),结果为:"D:""dir""file.cpp"为什么行为不同?根据C++17标准,哪个结果是正确的?

c++ - 递归算法的迭代版本较慢

我正在尝试实现Tarjan的强连接组件(SCC)的迭代版本,为方便起见,在此复制(来源:http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm)。Input:GraphG=(V,E)index=0//DFSnodenumbercounterS=empty//AnemptystackofnodesforallvinVdoif(v.indexisundefined)//StartaDFSateachnodetarjan(v)//wehaven'tvisitedyetprocedureta

c++ - 递归算法的迭代版本较慢

我正在尝试实现Tarjan的强连接组件(SCC)的迭代版本,为方便起见,在此复制(来源:http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm)。Input:GraphG=(V,E)index=0//DFSnodenumbercounterS=empty//AnemptystackofnodesforallvinVdoif(v.indexisundefined)//StartaDFSateachnodetarjan(v)//wehaven'tvisitedyetprocedureta

c++ - 是否有任何众所周知的迭代枚举值的范例?

我有一些C++代码,其中声明了以下枚举:enumSome{Some_Alpha=0,Some_Beta,Some_Gamma,Some_Total};intarray[Some_Total];Alpha、Beta和Gamma的值是连续的,我很乐意使用以下循环来遍历它们:for(intsomeNo=(int)Some_Alpha;someNo这个循环没问题,直到我决定改变枚举中声明的顺序,比如说,让Beta成为第一个值,而Alpha-第二个。这会使循环标题无效,因为现在我必须从Beta迭代到Total。那么,遍历枚举的最佳实践是什么?我想遍历所有值而不每次都更改循环标题。我可以想到一个解

c++ - 是否有任何众所周知的迭代枚举值的范例?

我有一些C++代码,其中声明了以下枚举:enumSome{Some_Alpha=0,Some_Beta,Some_Gamma,Some_Total};intarray[Some_Total];Alpha、Beta和Gamma的值是连续的,我很乐意使用以下循环来遍历它们:for(intsomeNo=(int)Some_Alpha;someNo这个循环没问题,直到我决定改变枚举中声明的顺序,比如说,让Beta成为第一个值,而Alpha-第二个。这会使循环标题无效,因为现在我必须从Beta迭代到Total。那么,遍历枚举的最佳实践是什么?我想遍历所有值而不每次都更改循环标题。我可以想到一个解

c++ - 迭代 boost::variant 中的类型

我正在使用boost变体来保存一些生成的类型,现在我的代码生成器会创建一个带有类型的header和一个能够保存它们的变体。在初始化时,我想迭代变量中允许的类型,而不是变量当前持有的类型。我可以使用变体来做到这一点吗? 最佳答案 boost::variant通过types公开其类型,这是一个MPL列表。您可以使用mpl::for_each对MPL列表执行运行时操作。:structprinter{templatevoidoperator()(Tt){std::coutvar;boost::mpl::for_each(printer())